package skyhyun;

public class J02_Operators {

	/**
	 *		연산자(Operator)
	 * 		- 컴퓨터 프로그램은 특정 기능을 수행할 작업들로 구성됨
	 * 		- 연산자는 이러한 작업을 표현하는 기호
	 * 		- 작업들에는 더하기, 빼기, 곱하기, 나누기, 비트 이동 등이 있음
	 * 		- 연산자는 한/두/세 개의 피 연산자에서 작업을 수행함
	 * 		- 피 연산자(Opernad)는 작업의 대상을 의미
	 */
	public static void main(String[] args) {
		
		// 1. 단항 연산자 : ++, --, !
		int val1 = 10;
		int val2 = ++val1;						// val1 = val1 + 1; (증가)
		int val3 = --val1;						// val1 = val1 - 1; (감소)
		boolean isMarried = true;
		
		//결과 출력
		System.out.println("val2 = " + val2);
		System.out.println("val3 = " + val3);
		System.out.println("!isMarried = " + !isMarried);
		
		// 2. 산술 연산자(이항 연산자) : +, -, *, /, %
		int op1 = 300;
		int op2 = 125;
		int op3 = 123;
		int op4 = 23;
		int plus = op1 + op2;
		int sub = op1 - op2;
		int mul = op1 * op2;
		int div = op1 / op2;
		// 정수를 정수로 나누면 결과도 정수
		float div2 = op1 / (float)op2;
		// 실수를 실수로 나누면 결과도 실수
		// 수식의 결과 유형과 그것을 저장하는 변수의 유형은 일치해야 한다.
		float div3 = op3 / (float)op4;
		double div4 = op3 / (float)op4;
		double div5 = op3 / (double)op4;
		// 실수 형 변환에 따라 미세한 오차가 발생할 수도 있음
		// Math 클래스를 이용하면 오차를 줄일 수 있음
		int mod = op1 % op2;
		
		// 결과 출력
		System.out.println("plus = " + plus);
		System.out.println("sub = " + sub);
		System.out.println("mul = " + mul);
		System.out.println("div = " + div);
		System.out.println("div2 = " + div2);
		System.out.println("div3 = " + div3);
		System.out.println("div4 = " + div4);
		System.out.println("div5 = " + div5);
		System.out.println("mod = " + mod);
		
		// 3. 관계/동등 연산자(이항 연산자) : >, <, >=, <=, ==, !=
		boolean rel1 = 100 > 150;
		boolean rel2 = 100 < 150;
		boolean rel3 = 100 >= 150;
		boolean rel4 = 100 <= 150;
		boolean rel5 = 100 == 150;
		boolean rel6 = op1 != op2;
		
		// 결과 출력
		System.out.println("rel1 = " + rel1);
		System.out.println("rel2 = " + rel2);
		System.out.println("rel3 = " + rel3);
		System.out.println("rel4 = " + rel4);
		System.out.println("rel5 = " + rel5);
		System.out.println("rel6 = " + rel6);

		// 4. 조건 연산자 : AND(&&), OR(||), ? :
		boolean cond1 = (100 > 150) && (op1 == op2);
			//Short-Circuit Evaluation(SCE)
			// 조건 연산 처리시 첫째 항의 연산 결과로 의해 전체 수식의 결과를 바로 알 수 있는 경우 나머지 항의 수식은 연산하지 않음
		boolean cond2 = (op1 == op2) && (100 > 150);
		boolean cond3 = (100 > 150) || (op1 == op2);
		char cond4 = (op1 == op2) ? '선' : '악';
			// 삼항 연산자 ? :
			// 형식은 (조건식) ? 참일 떄 처리 : 거짓일 떄 처리;
		
		// 결과 출력
		System.out.println("cond1 = " + cond1);
		System.out.println("cond2 = " + cond2);
		System.out.println("cond3 = " + cond3);
		System.out.println("cond4 = " + cond4);
		
		// 5. 대입 연산자 : =, +=, -=, *=, /=, %=
		int assg1 = 100;
		int assg2 = 100;
		int assg3 = 100;
		int assg4 = 100;
		int assg5 = 100;

		assg1 += 200;
		assg2 -= 200;
		assg3 *= 200;
		assg4 /= 75;
		assg5 %= 75;
		
		// 결과 출력
		System.out.println("assg1 = " + assg1);
		System.out.println("assg2 = " + assg2);
		System.out.println("assg3 = " + assg3);
		System.out.println("assg4 = " + assg4);
		System.out.println("assg5 = " + assg5);
		
	}
	
}